#include <cmath>
#include "ellipsoid_equilibrium.h"
#include "vtkObjectFactory.h"
namespace Mechanics { namespace Rattleback { namespace Ellipsoid {
namespace NoSlip {

vtkStandardNewMacro(EllipsoidEquilibrium);

// Construct rattleback with parameters from Kane
EllipsoidEquilibrium::EllipsoidEquilibrium()
{
  p.a = 0.2;                // x semi-diameter
  p.b = 0.03;               // y semi-diameter
  p.c = 0.02;               // z semi-diameter 
  p.d = p.e = 0.0;          // COM offset in x, y directions
  p.f = 0.01;               // COM offset in z direction
  p.m = 1.0;                // mass
  p.g = 9.81;               // graviational constant
  p.Ixx =  0.0002;          // xx moment of inertia
  p.Iyy =  0.0016;          // yy moment of inertia
  p.Izz =  0.0017;          // zz moment of inertia
  p.Ixy = -0.00002;         // xy product of inertia
  p.Iyz = p.Ixz = 0.0;      // yz, xz products of inertia
  p.s = 0.0;             // sigma, viscous air damping
}

double EllipsoidEquilibrium::EvaluateFunction(double x[3])
{
  const double a = p.a,
               b = p.b,
               c = p.c,
               d = p.d,
               e = p.e,
               f = p.f,
               m = p.m,
               Ixx = p.Ixx,
               Iyy = p.Iyy,
               Izz = p.Izz,
               Ixy = p.Ixy,
               Iyz = p.Iyz,
               Ixz = p.Ixz,
               g = p.g;

  double q1 = x[0], q2 = x[1];
  double z[73], h[4];

  // Intermediate variables for h's
  z[0] = pow(c, 2);
  z[1] = cos(q1);
  z[2] = sin(q1);
  z[3] = sin(q2);
  z[4] = pow(a, 2);
  z[5] = pow(b, 2);
  z[6] = cos(q2);
  z[7] = pow(e, 2);
  z[8] = pow(z[5], 2);
  z[9] = pow(f, 2);
  z[10] = pow(z[0], 2);
  z[11] = pow(d, 2);
  z[12] = pow(z[4], 2);
  z[13] = g*m;
  z[14] = d*m;
  z[15] = e*m;
  z[16] = 2*d;
  z[17] = pow(z[1], 2);
  z[18] = pow(z[6], 2);
  z[19] = pow(z[3], 2);
  z[20] = pow(z[2], 2);
  z[21] = pow(z[17], 3.0/2.0);
  z[22] = pow(z[20], 3.0/2.0);
  z[23] = pow(z[18], 3.0/2.0);
  z[24] = pow(z[23], 4.0/3.0);
  z[25] = pow(z[19], 3.0/2.0);
  z[26] = pow(z[25], 4.0/3.0);
  z[27] = pow(z[21], 4.0/3.0);
  z[28] = m*z[5];
  z[29] = d*z[1];
  z[30] = m*z[2];
  z[31] = f*z[3];
  z[32] = e*z[1];
  z[33] = d*z[2];
  z[34] = Iyy*z[1];
  z[35] = m*z[8];
  z[36] = f*z[17];
  z[37] = z[2]*z[6];
  z[38] = z[1]*z[3];
  z[39] = z[18]*z[2];
  z[40] = z[1]*z[18];
  z[41] = z[20]*z[6];
  z[42] = z[17]*z[3];
  z[43] = z[19]*z[2];
  z[44] = z[20]*z[3];
  z[45] = z[19]*z[6];
  z[46] = z[1]*z[19];
  z[47] = z[19]*z[4];
  z[48] = z[0]*z[19];
  z[49] = z[17]*z[25];
  z[50] = m*z[21]*z[4];
  z[51] = z[18]*z[21];
  z[52] = z[17]*z[18];
  z[53] = z[17]*z[23];
  z[54] = z[4]*z[42];
  z[55] = z[42]*z[6];
  z[56] = z[21]*z[47];
  z[57] = m*z[25]*z[27]*z[6];
  z[58] = z[0]*z[52] + z[17]*z[47] + z[20]*z[5];
  z[59] = 1.0/z[58];
  z[60] = z[0]*z[59];
  z[61] = sqrt(z[59]);
  z[62] = z[21]*z[59];
  z[63] = f*z[61];
  z[64] = d*z[61];
  z[65] = z[22]*z[59];
  z[66] = z[6]*z[61];
  z[67] = z[0]*z[61];
  z[68] = z[4]*z[61];
  z[69] = z[18]*z[61];
  z[70] = z[1]*z[5]*z[61];
  z[71] = 2*z[20]*z[61];
  z[72] = m*z[23]*z[27]*z[3]*z[59];

  // h's
  h[0] = z[13]*(-f*z[37] + z[1]*z[39]*z[67] + z[1]*z[43]*z[68] + z[18]*z[32] + z[19]*z[32] + z[3]*z[33] - z[39]*z[70] - z[43]*z[70]);
  h[1] = -Ixx*z[1]*z[43] - Ixy*z[18]*z[42] + Ixy*z[44] - Ixy*z[49] + 2*Ixz*z[37]*z[38] + Iyz*z[17]*z[45] - Iyz*z[41] + Iyz*z[53] - Izz*z[1]*z[39] + e*z[14]*z[18]*z[42] - e*z[14]*z[44] + e*z[14]*z[49] + f*z[15]*z[41] - 2*z[1]*z[14]*z[31]*z[37] + z[10]*z[24]*z[30]*z[62] + z[11]*z[30]*z[46] + z[12]*z[26]*z[30]*z[62] - z[14]*z[2]*z[49]*z[5]*z[61] + 2*z[14]*z[2]*z[49]*z[68] + z[14]*z[22]*z[3]*z[5]*z[61] - z[14]*z[39]*z[42]*z[5]*z[61] + 2*z[14]*z[39]*z[42]*z[67] - z[15]*z[20]*z[40]*z[67] - z[15]*z[20]*z[46]*z[68] + z[15]*z[21]*z[24]*z[67] + z[15]*z[21]*z[26]*z[68] - z[15]*z[23]*z[36] - z[15]*z[36]*z[45] + z[15]*z[40]*z[5]*z[71] + z[15]*z[46]*z[5]*z[71] + z[15]*z[47]*z[51]*z[61] + z[15]*z[48]*z[51]*z[61] + z[19]*z[28]*z[36]*z[37]*z[61] - z[2]*z[21]*z[24]*z[28]*z[60] + z[2]*z[23]*z[28]*z[36]*z[61] - z[2]*z[26]*z[28]*z[4]*z[62] + z[22]*z[28]*z[40]*z[60] - z[22]*z[28]*z[6]*z[63] - 2*z[23]*z[30]*z[36]*z[67] - z[28]*z[39]*z[48]*z[62] - z[28]*z[39]*z[56]*z[59] + z[28]*z[4]*z[46]*z[65] - 2*z[30]*z[36]*z[45]*z[68] - z[30]*z[40]*z[7] + z[30]*z[40]*z[9] - z[30]*z[46]*z[7] + 2*z[30]*z[47]*z[51]*z[60] + z[34]*z[39] + z[34]*z[43] - z[35]*z[40]*z[65] - z[35]*z[46]*z[65];
  h[2] = z[13]*(-z[1]*z[31] - z[29]*z[6] - z[54]*z[66] + z[55]*z[67]);
  h[3] = Ixx*z[55] - Ixy*z[1]*z[37] + Ixz*z[17]*z[19] - Ixz*z[52] - Iyz*z[2]*z[38] - Izz*z[55] - m*z[11]*z[55] - m*z[23]*z[27]*z[3]*z[4]*z[60] - 2*m*z[31]*z[51]*z[67] + m*z[55]*z[9] + z[1]*z[15]*z[2]*z[31] - z[1]*z[20]*z[28]*z[31]*z[61] + z[10]*z[72] - z[12]*z[57]*z[59] + z[14]*z[18]*z[36] - z[14]*z[19]*z[36] - z[14]*z[21]*z[23]*z[67] + z[14]*z[21]*z[45]*z[67] - 2*z[14]*z[21]*z[45]*z[68] + z[14]*z[32]*z[37] - z[14]*z[41]*z[70] - z[15]*z[37]*z[42]*z[67] + z[15]*z[37]*z[54]*z[61] - z[25]*z[50]*z[63] + z[28]*z[41]*z[42]*z[60] - z[28]*z[41]*z[54]*z[59] + z[31]*z[50]*z[69] + z[4]*z[57]*z[60];

  return sqrt(pow(h[0] + h[1]*x[2]*x[2], 2.0) + pow(h[2] + h[3]*x[2]*x[2], 2.0));
}

void EllipsoidEquilibrium::EvaluateGradient(double x[3], double dx[3])
{
  const double a = p.a,
               b = p.b,
               c = p.c,
               d = p.d,
               e = p.e,
               f = p.f,
               m = p.m,
               Ixx = p.Ixx,
               Iyy = p.Iyy,
               Izz = p.Izz,
               Ixy = p.Ixy,
               Iyz = p.Iyz,
               Ixz = p.Ixz,
               g = p.g;

  double q1 = x[0], q2 = x[1];
  double z[215], dh[8];
  // Intermediate variables for dh's
  z[0] = pow(a, 2);
  z[1] = pow(b, 2);
  z[2] = cos(q1);
  z[3] = sin(q1);
  z[4] = pow(c, 2);
  z[5] = sin(q2);
  z[6] = cos(q2);
  z[7] = pow(e, 2);
  z[8] = pow(z[0], 2);
  z[9] = pow(z[4], 2);
  z[10] = pow(z[1], 2);
  z[11] = pow(f, 2);
  z[12] = pow(d, 2);
  z[13] = d*m;
  z[14] = 2*Ixy;
  z[15] = e*f;
  z[16] = 2*Iyz;
  z[17] = 2*e;
  z[18] = g*m;
  z[19] = 2*f;
  z[20] = 2*m;
  z[21] = pow(z[2], 2);
  z[22] = pow(z[5], 2);
  z[23] = pow(z[3], 2);
  z[24] = pow(z[6], 2);
  z[25] = pow(z[22], 3.0/2.0);
  z[26] = pow(z[21], 3.0/2.0);
  z[27] = pow(z[25], 4.0/3.0);
  z[28] = pow(z[24], 2);
  z[29] = pow(z[23], 3.0/2.0);
  z[30] = pow(z[26], 4.0/3.0);
  z[31] = pow(z[28], 3.0/4.0);
  z[32] = pow(z[29], 4.0/3.0);
  z[33] = m*z[1];
  z[34] = e*z[3];
  z[35] = f*z[2];
  z[36] = d*z[3];
  z[37] = Ixz*z[5];
  z[38] = m*z[6];
  z[39] = 2*z[5];
  z[40] = d*z[2];
  z[41] = 2*z[2];
  z[42] = f*z[3];
  z[43] = e*z[0];
  z[44] = 4*z[4];
  z[45] = 2*z[0];
  z[46] = 2*z[6];
  z[47] = z[0]*z[2];
  z[48] = z[0]*z[5];
  z[49] = m*z[31];
  z[50] = z[5]*z[9];
  z[51] = e*z[26];
  z[52] = 3*z[21];
  z[53] = m*z[24];
  z[54] = f*z[22];
  z[55] = z[5]*z[6];
  z[56] = z[2]*z[3];
  z[57] = m*z[22];
  z[58] = z[4]*z[5];
  z[59] = f*z[26];
  z[60] = Ixx*z[21];
  z[61] = f*z[29];
  z[62] = z[2]*z[4];
  z[63] = e*z[23];
  z[64] = e*z[29];
  z[65] = 3*z[22];
  z[66] = z[36]*z[6];
  z[67] = z[42]*z[5];
  z[68] = z[40]*z[5];
  z[69] = z[35]*z[6];
  z[70] = z[23]*z[5];
  z[71] = z[23]*z[6];
  z[72] = z[21]*z[6];
  z[73] = z[22]*z[3];
  z[74] = z[0]*z[27];
  z[75] = z[24]*z[5];
  z[76] = z[23]*z[7];
  z[77] = z[26]*z[3];
  z[78] = z[0]*z[22];
  z[79] = z[26]*z[6];
  z[80] = z[24]*z[4];
  z[81] = z[1]*z[22];
  z[82] = z[12]*z[21];
  z[83] = z[28]*z[4];
  z[84] = z[0]*z[21];
  z[85] = z[25]*z[3];
  z[86] = z[21]*z[7];
  z[87] = z[21]*z[5];
  z[88] = z[0]*z[25];
  z[89] = z[21]*z[4];
  z[90] = z[11]*z[21];
  z[91] = z[25]*z[8];
  z[92] = z[2]*z[24];
  z[93] = z[1]*z[24];
  z[94] = z[2]*z[23];
  z[95] = Iyz*z[70];
  z[96] = Ixy*z[71];
  z[97] = z[23]*z[25];
  z[98] = z[22]*z[29];
  z[99] = d*z[26]*z[4];
  z[100] = z[24]*z[26];
  z[101] = m*z[27]*z[8];
  z[102] = z[21]*z[22];
  z[103] = z[25]*z[26];
  z[104] = z[21]*z[31];
  z[105] = z[21]*z[25];
  z[106] = z[23]*z[24];
  z[107] = m*z[28]*z[9];
  z[108] = z[21]*z[24];
  z[109] = z[22]*z[23];
  z[110] = z[22]*z[60];
  z[111] = Izz*z[108];
  z[112] = z[25]*z[4]*z[6];
  z[113] = m*z[15]*z[70];
  z[114] = z[13]*z[6]*z[63];
  z[115] = z[29]*z[92];
  z[116] = Ixz*z[24]*z[3]*z[41];
  z[117] = Ixz*z[41]*z[73];
  z[118] = z[57]*z[82];
  z[119] = z[53]*z[90];
  z[120] = Izz*z[39]*z[56]*z[6];
  z[121] = Ixx*z[39]*z[56]*z[6];
  z[122] = z[13]*z[19]*z[22]*z[56];
  z[123] = z[13]*z[19]*z[24]*z[56];
  z[124] = z[12]*z[20]*z[55]*z[56];
  z[125] = z[11]*z[20]*z[55]*z[56];
  z[126] = -z[48]*z[72] + z[55]*z[89];
  z[127] = -z[0]*z[39]*z[72] + z[39]*z[4]*z[72];
  z[128] = z[0]*z[126];
  z[129] = z[126]*z[6];
  z[130] = z[126]*z[4];
  z[131] = z[126]*z[2];
  z[132] = z[126]*z[24];
  z[133] = z[126]*z[21];
  z[134] = z[1]*z[23] + z[21]*z[78] + z[21]*z[80];
  z[135] = z[0]*z[127];
  z[136] = 1.0/z[134];
  z[137] = 2*z[136];
  z[138] = 2*z[137];
  z[139] = z[127]*z[30];
  z[140] = -z[1]*z[56] + z[47]*z[73] + z[56]*z[80];
  z[141] = pow(z[136], 2);
  z[142] = pow(z[141], 1.0/4.0);
  z[143] = pow(z[142], 3);
  z[144] = z[141]*z[4];
  z[145] = m*z[142];
  z[146] = z[136]*z[30];
  z[147] = 2*z[142];
  z[148] = m*z[143];
  z[149] = z[137]*z[142];
  z[150] = 3*z[142];
  z[151] = m*z[140];
  z[152] = z[136]*z[23];
  z[153] = z[136]*z[32];
  z[154] = d*z[142];
  z[155] = z[0]*z[141];
  z[156] = f*z[143];
  z[157] = z[141]*z[30];
  z[158] = z[143]*z[6];
  z[159] = z[140]*z[3];
  z[160] = z[143]*z[2];
  z[161] = z[1]*z[140];
  z[162] = z[0]*z[140];
  z[163] = z[0]*z[41]*z[73] - z[1]*z[3]*z[41] + z[3]*z[41]*z[80];
  z[164] = 2*z[13]*z[147];
  z[165] = z[143]*z[22];
  z[166] = z[142]*z[23];
  z[167] = z[140]*z[21];
  z[168] = z[142]*z[21];
  z[169] = z[140]*z[25];
  z[170] = z[143]*z[21];
  z[171] = m*z[10]*z[141]*z[2];
  z[172] = z[107]*z[141];
  z[173] = z[108]*z[142];
  z[174] = z[163]*z[28];
  z[175] = z[10]*z[141]*z[2]*z[29];
  z[176] = d*z[143]*z[29]*z[5];
  z[177] = z[163]*z[30];
  z[178] = z[101]*z[146];
  z[179] = z[107]*z[146];
  z[180] = z[168]*z[78];
  z[181] = z[168]*z[80];
  z[182] = z[1]*z[13]*z[142]*z[29]*z[6];
  z[183] = z[142]*z[33]*z[5]*z[61];
  z[184] = z[142]*z[3]*z[39]*z[47]*z[6];
  z[185] = z[142]*z[39]*z[4]*z[56]*z[6];
  z[186] = z[103]*z[13]*z[142]*z[45];
  z[187] = z[142]*z[19]*z[26]*z[4]*z[49];
  z[188] = z[136]*z[20]*z[46]*z[77]*z[91];
  z[189] = z[136]*z[20]*z[31]*z[39]*z[77]*z[9];
  z[190] = z[1]*z[136]*z[20]*z[29]*z[47]*z[55];
  z[191] = z[1]*z[136]*z[20]*z[29]*z[55]*z[62];
  z[192] = z[142]*z[17]*z[38]*z[58]*z[94];
  z[193] = z[0]*z[136]*z[20]*z[31]*z[39]*z[4]*z[77];
  z[194] = z[142]*z[17]*z[38]*z[47]*z[70];
  z[195] = z[112]*z[136]*z[20]*z[45]*z[77];
  z[196] = z[142]*z[19]*z[3]*z[52]*z[53]*z[58];
  z[197] = z[13]*z[142]*z[45]*z[52]*z[6]*z[73];
  z[198] = z[126]*z[143];
  z[199] = z[127]*z[141];
  z[200] = z[129]*z[143];
  z[201] = z[126]*z[165];
  z[202] = z[135]*z[141];
  z[203] = z[184] + z[66] + z[67];
  z[204] = z[198]*z[78];
  z[205] = z[140]*z[143];
  z[206] = z[140]*z[148];
  z[207] = z[110] + z[111] + z[187];
  z[208] = z[140]*z[160];
  z[209] = z[141]*z[163];
  z[210] = m*z[209];
  z[211] = z[180] + z[181] + z[68];
  z[212] = z[118] + z[119] + z[178] + z[179] + z[186];
  z[213] = z[113] + z[114] + z[117] + z[121] + z[123] + z[125] + z[189] + z[191] + z[194] + z[195];
  z[214] = z[116] + z[120] + z[122] + z[124] + z[182] + z[183] + z[188] + z[190] + z[192] + z[193] + z[196] + z[197] + z[95] + z[96];

  // dh's
  dh[0] = z[18]*(z[143]*z[47]*z[73]*(-z[1]*z[56] + z[56]*z[78] + z[56]*z[80]) + z[143]*z[56]*z[80]*(-z[1]*z[2]*z[3] + z[24]*z[3]*z[62] + z[47]*z[73]) - z[143]*z[56]*z[81]*(-z[1]*z[2]*z[3] + z[24]*z[3]*z[62] + z[47]*z[73]) - z[143]*z[56]*z[93]*(-z[1]*z[2]*z[3] + z[24]*z[3]*z[62] + z[47]*z[73]) - z[166]*z[78] - z[166]*z[80] + z[166]*z[81] + z[166]*z[93] - z[168]*z[81] - z[168]*z[93] + z[211] - z[22]*z[34] - z[24]*z[34] - z[69]);
  dh[1] = z[18]*(-z[185] + z[198]*z[47]*z[73] + z[198]*z[56]*z[80] - z[198]*z[56]*z[81] - z[198]*z[56]*z[93] + z[203]);
  dh[2] = Ixx*z[109] + Iyy*z[102] - Iyy*z[106] + Iyy*z[108] - Iyy*z[109] + Izz*z[106] - z[1]*z[103]*z[13]*z[142] - z[1]*z[13]*z[142]*z[26]*z[75] + z[1]*z[13]*z[142]*z[41]*z[97] + z[1]*z[13]*z[150]*z[2]*z[70] - z[1]*z[13]*z[159]*z[170]*z[75] + z[1]*z[13]*z[166]*z[39]*z[92] + z[1]*z[168]*z[17]*z[20]*z[73] - z[10]*z[152]*z[52]*z[53] - z[10]*z[152]*z[52]*z[57] + z[10]*z[153]*z[53] + z[10]*z[153]*z[57] - z[100]*z[155]*z[33]*z[73]*(-z[1]*z[3]*z[41] + z[3]*z[41]*z[78] + z[3]*z[41]*z[80]) - z[101]*z[152]*z[52] + z[101]*z[209]*z[77] + z[104]*z[205]*z[33]*z[42] + z[106]*z[136]*z[33]*z[52]*z[78] - z[107]*z[152]*z[52] + z[109]*z[136]*z[33]*z[52]*z[80] - z[11]*z[23]*z[53] - z[12]*z[23]*z[57] + z[13]*z[142]*z[26]*z[39]*z[80] - z[13]*z[142]*z[41]*z[45]*z[97] + z[13]*z[143]*z[161]*z[29]*z[5] + z[13]*z[143]*z[167]*z[45]*z[85] - z[13]*z[161]*z[170]*z[85] - z[13]*z[166]*z[39]*z[41]*z[80] - z[13]*z[17]*z[25]*z[56] - z[13]*z[17]*z[5]*z[56] - z[13]*z[17]*z[56]*z[75] + z[13]*z[170]*z[3]*z[39]*z[80]*(-z[1]*z[56] + z[24]*z[4]*z[56] + z[47]*z[73]) - z[13]*z[19]*z[21]*z[55] + z[13]*z[19]*z[23]*z[55] + z[14]*z[25]*z[56] + z[14]*z[5]*z[56] + z[14]*z[56]*z[75] - z[140]*z[158]*z[33]*z[61] + z[140]*z[165]*z[17]*z[33]*z[94] + z[140]*z[165]*z[26]*z[43]*z[53] + z[140]*z[165]*z[33]*z[42]*z[72] + z[140]*z[165]*z[4]*z[51]*z[53] - z[141]*z[26]*z[33]*z[73]*z[80]*(-z[1]*z[3]*z[41] + z[24]*z[3]*z[4]*z[41] + z[3]*z[41]*z[78]) - z[142]*z[17]*z[24]*z[29]*z[33] - z[142]*z[17]*z[3]*z[53]*z[89] - z[142]*z[17]*z[3]*z[57]*z[84] - z[142]*z[17]*z[33]*z[98] - z[142]*z[19]*z[2]*z[22]*z[33]*z[71] + z[142]*z[19]*z[20]*z[22]*z[47]*z[71] - z[142]*z[19]*z[26]*z[38]*z[78] - z[142]*z[19]*z[31]*z[33]*z[94] - z[142]*z[22]*z[34]*z[4]*z[52]*z[53] + z[142]*z[29]*z[43]*z[57] + z[142]*z[31]*z[33]*z[59] + z[142]*z[33]*z[54]*z[79] - z[142]*z[34]*z[52]*z[53]*z[78] + z[142]*z[4]*z[53]*z[64] - z[143]*z[159]*z[19]*z[49]*z[89] - z[143]*z[19]*z[38]*z[73]*z[84]*(-z[1]*z[56] + z[22]*z[3]*z[47] + z[56]*z[80]) - z[145]*z[34]*z[52]*z[74] - z[145]*z[34]*z[52]*z[83] + z[146]*z[20]*z[78]*z[80] - z[146]*z[22]*z[33]*z[80] - z[146]*z[24]*z[33]*z[78] - z[146]*z[33]*z[74] - z[146]*z[33]*z[83] + z[15]*z[20]*z[22]*z[56]*z[6] + z[15]*z[20]*z[31]*z[56] + z[15]*z[20]*z[56]*z[6] - z[150]*z[23]*z[33]*z[69] - z[152]*z[20]*z[52]*z[78]*z[80] + z[152]*z[33]*z[52]*z[74] + z[152]*z[33]*z[52]*z[78] + z[152]*z[33]*z[52]*z[80] + z[152]*z[33]*z[52]*z[83] - z[153]*z[33]*z[78] - z[153]*z[33]*z[80] + z[155]*z[20]*z[26]*z[73]*z[80]*(-z[1]*z[3]*z[41] + z[24]*z[3]*z[4]*z[41] + z[3]*z[41]*z[78]) - z[16]*z[22]*z[56]*z[6] - z[16]*z[31]*z[56] - z[16]*z[56]*z[6] + z[163]*z[172]*z[77] - z[163]*z[175]*z[53] - z[163]*z[175]*z[57] + z[166]*z[19]*z[20]*z[31]*z[62] + z[168]*z[17]*z[20]*z[3]*z[93] + z[17]*z[205]*z[23]*z[33]*z[92] - z[205]*z[43]*z[57]*z[94] - z[205]*z[53]*z[62]*z[63] + z[206]*z[26]*z[27]*z[43] + z[206]*z[51]*z[83] - z[207] + z[209]*z[24]*z[29]*z[33]*z[62] + z[209]*z[33]*z[47]*z[98] - z[209]*z[33]*z[74]*z[77] - z[209]*z[33]*z[77]*z[83] + z[21]*z[37]*z[46] + z[212] - z[23]*z[37]*z[46] + z[53]*z[76] - z[53]*z[86] + z[57]*z[76] - z[57]*z[86];
  dh[3] = -Ixy*z[104] - Ixy*z[22]*z[72] - Iyz*z[105] - Iyz*z[21]*z[75] + e*z[104]*z[13] + e*z[13]*z[22]*z[72] + m*z[105]*z[15] - z[1]*z[104]*z[13]*z[142]*z[3] + z[1]*z[112]*z[136]*z[20]*z[77] - z[1]*z[13]*z[133]*z[143]*z[3]*z[75] - z[1]*z[13]*z[133]*z[143]*z[85] - z[1]*z[13]*z[142]*z[72]*z[73] + z[1]*z[13]*z[198]*z[29]*z[5] - z[1]*z[136]*z[20]*z[31]*z[48]*z[77] + z[1]*z[136]*z[20]*z[31]*z[58]*z[77] - z[1]*z[136]*z[20]*z[6]*z[77]*z[88] - z[100]*z[202]*z[33]*z[73] + z[101]*z[199]*z[77] - z[103]*z[142]*z[17]*z[38]*z[4] + z[104]*z[198]*z[33]*z[42] - z[105]*z[142]*z[33]*z[42] + z[126]*z[148]*z[26]*z[27]*z[43] + z[126]*z[148]*z[51]*z[83] + z[127]*z[172]*z[77] - z[127]*z[175]*z[53] - z[127]*z[175]*z[57] + z[13]*z[133]*z[143]*z[3]*z[39]*z[80] + z[13]*z[133]*z[143]*z[45]*z[85] - z[13]*z[142]*z[44]*z[72]*z[73] + z[13]*z[147]*z[3]*z[31]*z[89] + z[130]*z[165]*z[51]*z[53] + z[142]*z[17]*z[26]*z[38]*z[88] + z[142]*z[17]*z[26]*z[48]*z[49] - z[142]*z[17]*z[26]*z[49]*z[58] - z[143]*z[19]*z[3]*z[49]*z[89]*(z[21]*z[4]*z[55] - z[48]*z[72]) + z[145]*z[19]*z[84]*z[85] + z[15]*z[53]*z[87] + z[165]*z[33]*z[42]*z[72]*(-z[21]*z[48]*z[6] + z[55]*z[89]) + z[17]*z[198]*z[23]*z[33]*z[92] + z[17]*z[201]*z[33]*z[94] - z[173]*z[19]*z[20]*z[3]*z[48] - z[173]*z[33]*z[67] - z[19]*z[198]*z[38]*z[73]*z[84] - z[198]*z[43]*z[57]*z[94] - z[198]*z[53]*z[62]*z[63] + z[199]*z[24]*z[29]*z[33]*z[62] - z[199]*z[26]*z[33]*z[73]*z[80] + z[199]*z[33]*z[47]*z[98] - z[199]*z[33]*z[74]*z[77] - z[199]*z[33]*z[77]*z[83] + z[20]*z[202]*z[26]*z[73]*z[80] - z[200]*z[33]*z[61] + z[201]*z[26]*z[43]*z[53] - z[213] + z[214];
  dh[4] = z[18]*(-z[185] + z[203] - z[205]*z[48]*z[72] + z[205]*z[55]*z[89]);
  dh[5] = z[18]*(-z[142]*z[22]*z[89] - z[142]*z[24]*z[84] - z[143]*z[48]*z[72]*(-z[55]*z[84] + z[55]*z[89]) + z[143]*z[55]*z[89]*(-z[48]*z[72] + z[58]*z[72]) + z[211] - z[69]);
  dh[6] = -Ixy*z[72] - Iyz*z[87] + e*z[13]*z[72] + m*z[15]*z[87] - z[1]*z[13]*z[168]*z[3]*z[46] + z[1]*z[136]*z[20]*z[4]*z[55]*z[77] - z[1]*z[136]*z[20]*z[48]*z[6]*z[77] + z[13]*z[140]*z[165]*z[4]*z[79] - z[13]*z[140]*z[165]*z[45]*z[79] + z[13]*z[142]*z[3]*z[31]*z[4]*z[52] - z[13]*z[142]*z[4]*z[52]*z[6]*z[73] - z[13]*z[160]*z[161]*z[71] - z[13]*z[205]*z[26]*z[31]*z[4] - z[142]*z[19]*z[3]*z[33]*z[87] + z[142]*z[26]*z[38]*z[43]*z[5] - z[142]*z[38]*z[51]*z[58] - z[142]*z[42]*z[48]*z[52]*z[53] + z[143]*z[167]*z[34]*z[38]*z[48] - z[143]*z[167]*z[34]*z[38]*z[58] + z[144]*z[177]*z[38]*z[88] - z[144]*z[177]*z[48]*z[49] + z[145]*z[42]*z[52]*z[88] - z[157]*z[163]*z[38]*z[91] + z[157]*z[163]*z[49]*z[50] - z[19]*z[205]*z[26]*z[53]*z[58] - z[205]*z[33]*z[35]*z[70] + z[205]*z[48]*z[53]*z[59] - z[206]*z[59]*z[88] - z[209]*z[21]*z[33]*z[48]*z[71] + z[209]*z[23]*z[33]*z[55]*z[89] - z[213] + z[214];
  dh[7] = Ixy*z[5]*z[56] - Iyz*z[56]*z[6] + Izz*z[102] - m*z[0]*z[146]*z[83] - m*z[146]*z[4]*z[74] - 5*z[0]*z[142]*z[26]*z[38]*z[54] + z[0]*z[142]*z[49]*z[59] + z[0]*z[146]*z[20]*z[65]*z[80] - z[1]*z[13]*z[131]*z[143]*z[71] + z[1]*z[13]*z[142]*z[2]*z[70] - z[100]*z[13]*z[142]*z[39]*z[45] + 5*z[100]*z[13]*z[142]*z[58] - z[103]*z[13]*z[142]*z[4] - z[106]*z[136]*z[33]*z[84] - z[109]*z[136]*z[33]*z[89] - z[126]*z[148]*z[59]*z[88] - z[13]*z[130]*z[143]*z[26]*z[31] + z[13]*z[130]*z[165]*z[79] - z[13]*z[19]*z[39]*z[72] - z[13]*z[2]*z[34]*z[5] - z[13]*z[201]*z[45]*z[79] - z[133]*z[143]*z[34]*z[38]*z[58] - z[139]*z[141]*z[38]*z[91] + z[139]*z[141]*z[49]*z[50] + z[139]*z[144]*z[38]*z[88] - z[139]*z[144]*z[48]*z[49] + z[142]*z[19]*z[20]*z[22]*z[4]*z[79] + z[142]*z[34]*z[53]*z[84] - z[142]*z[34]*z[53]*z[89] - z[142]*z[34]*z[57]*z[84] + z[142]*z[34]*z[57]*z[89] + z[143]*z[48]*z[53]*z[59]*(-z[55]*z[84] + z[55]*z[89]) - z[146]*z[53]*z[65]*z[8] - z[146]*z[53]*z[65]*z[9] + z[15]*z[38]*z[56] + z[152]*z[21]*z[33]*z[78] + z[152]*z[21]*z[33]*z[80] - z[166]*z[33]*z[69] + z[170]*z[34]*z[38]*z[48]*(-z[55]*z[84] + z[55]*z[89]) - z[19]*z[198]*z[26]*z[53]*z[58] - z[198]*z[33]*z[35]*z[70] - z[199]*z[21]*z[33]*z[48]*z[71] + z[199]*z[23]*z[33]*z[55]*z[89] - z[207] + 2*z[21]*z[37]*z[46] + z[212] + z[24]*z[60] - z[53]*z[82] - z[57]*z[90];


}

void EllipsoidEquilibrium::SetParameters(parameters &params)
{
  p = params;
}
}}}}
